/*
 * This file is part of Media Player Classic HomeCinema.
 *
 * MPC-HC is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * MPC-HC is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#include "avcodec.h"
#include "internal.h"
#include "ac3.h"
#include "ac3_parser.h"
#include "ac3dec.h"
#include "ac3dec_data.h"

#ifdef __GNUC__
#define _aligned_malloc		__mingw_aligned_malloc
#define _aligned_realloc	__mingw_aligned_realloc
#define _aligned_free		__mingw_aligned_free
#endif

int FFGetChannelMap(struct AVCodecContext * avctx)
{
	switch (avctx->codec_id)
	{
	case CODEC_ID_EAC3 :
	case CODEC_ID_AC3  :
		{
			AC3DecodeContext *s = avctx->priv_data;

			// Mapping index for s_scmap_ac3
			switch (s->channel_mode)
			{
			case AC3_CHMODE_DUALMONO: return 0;
			case AC3_CHMODE_MONO	: return 1;
			case AC3_CHMODE_STEREO	: return 2;
			case AC3_CHMODE_3F		: return 3;
			case AC3_CHMODE_2F1R	: return 4;
			case AC3_CHMODE_3F1R	: return 5;
			case AC3_CHMODE_2F2R	: return 6;
			case AC3_CHMODE_3F2R	: return (s->lfe_on ? 8 : 7);
			}
		}
		break;
	case CODEC_ID_MLP  :
		{
			// Mapping index for s_scmap_lpcm
			if (avctx->channels<=8)
				return avctx->channels-1;
			else
				return -1;
		}
	default :
		return 2;
	}
	return -1;
}


void* FF_aligned_malloc(size_t size, size_t alignment)
{
	return _aligned_malloc(size,alignment);
}

void FF_aligned_free(void* mem_ptr)
{
	if (mem_ptr)
		_aligned_free(mem_ptr);
}

void* FF_aligned_realloc(void *ptr,size_t size,size_t alignment)
{
	if (!ptr)
		return FF_aligned_malloc(size,alignment);
	else
		if (size==0)
		{
			FF_aligned_free(ptr);
			return NULL;
		}
		else
			return _aligned_realloc(ptr,size,alignment);
}
